package com.explorati.interview.interview.chapterfour;

/**
 * 只有使用引号包含文本的方式创建的String对象之间使用"+"连接产生的新对象才会被加入字符串池中，对于所有包含new方式新建对象(包括Null)
 * 的"+"连接表达式，他所产生的新对象都不会加入字符串池中
 * 
 * @author explorati
 *
 */
public class StringBBTest {

	public static final String A = "ab";
	public static final String B = "cd";

	public static final String C;
	public static final String D;
	static {
		C = "ab";
		D = "cd";
	}

	public static void main(String[] args) {
		// 当A、B都是static、final的时候是相等的
		String s = A + B;
		// 当C和D在静态代码块中赋值时
		String x = C + D;
		String a = "ab";
		String b = "cd";

		String c = "ab" + "cd";
		String d = a + "cd";

		String f = "abcd";
		String e = "abcd";
		// true，当都是static、final时，由于在编译期就能确定，为常量，值固定
		System.out.println(s == f);
		// false,C和D虽然被定义为常量(只能被赋值一次),但是他们没有马上被赋值，至于他们何时被赋值，是个变数
		//C、D在被赋值前，性质类似于一个变量，所以x就不能在编译期被确定，而只能在运行时被创建
		System.out.println(x == f);
		// true：因为c是文本相加创建的
		System.out.println(c == e);
		// false，只有文本相加创建的才能加入字符串池中
		System.out.println(d == e);
		// true
		System.out.println(f == e);

		String str2 = new String("hello");
		String str1 = "hello";
		// false
		System.out.println("str1 == str2 : " + str1 == str2);
		// System.out.println(f == e);
		System.out.println("你好");
	}
}
